// 泛型：一般化的类型可以代表多种类型
// TS 中的泛型是类型参数化实现的，所以全称：泛型参数
// 泛型函数：
function identity<T>(arg: T): T {
  return arg;
}

let num = identity<number>(1);
let str = identity("1"); // TS 会自动推导出 T 的类型

// 泛型接口
interface ApiResponse<T> {
  success: boolean;
  object: T;
}

interface User {
  id: number;
  name: string;
  age: number;
}

interface Todo {
  id: number;
  title: string;
  completed: boolean;
}

const response = await fetch("http://localhost:3000/api/user");
// 通过 as 断言来指定泛型参数的类型
const data = (await response.json()) as ApiResponse<Todo>;
data.object.title;

// 泛型类
class Queue<T> {
  private data: T[] = [];
  push(item: T) {
    this.data.push(item);
  }
  pop(): T | undefined {
    return this.data.shift();
  }
}

const queue = new Queue<number>();
queue.push(1);
queue.push(2);
queue.push(3);
const q2 = new Queue<string>();
q2.push("hello");
q2.push("world");
q2.push("typescript");
